import 'package:dio/dio.dart';
import 'package:flutter_order_hybrid/utils/TokenManager.dart';

class RequestDio {
  final _dio = Dio(); // 声明dio实例对象
  // 构造函数
  RequestDio() {
    // 设置dio基础地址
    // 超时时间
    _dio
      ..options.baseUrl = "https://meikou-api.itheima.net"
      ..options.receiveTimeout = const Duration(seconds: 20)
      ..options.sendTimeout = const Duration(seconds: 20);

    // 添加拦截器
    // 请求拦截器
    // 响应拦截器
    // 错误拦截器
    _dioAddInterceptors();
  }
  // 添加拦截器
  _dioAddInterceptors() {
    _dio.interceptors.add(InterceptorsWrapper(onRequest: (request, handler) {
      // todo 注入token
      request.headers["Authorization"] = 'Bearer ${TokenManager.token}';
      handler.next(request);
    }, onResponse: (response, handler) {
      // 响应拦截器
      handler.next(response);
    }));
  }

  // 接口文档

  // 获取方法
  Future get(String url, {Map<String, dynamic>? params}) async {
    final result = await _dio.get(url, queryParameters: params);
    // 需要对数据进行二次处理
    return _handleResponse(result);
  }

  // 上传接口
  Future upload(String url, {FormData? data}) async {
    final result = await _dio.post(url, data: data);
    // 需要对数据进行二次处理
    return _handleResponse(result);
  }

  Future post(String url, {Map<String, dynamic>? data}) async {
    final result = await _dio.post(url, data: data);
    // 需要对数据进行二次处理
    return _handleResponse(result);
  }

  Future delete(String url,
      {Map<String, dynamic>? data, Map<String, dynamic>? params}) async {
    final result = await _dio.delete(url, queryParameters: params, data: data);
    // 需要对数据进行二次处理
    return _handleResponse(result);
  }

  Future put(String url,
      {Map<String, dynamic>? data, Map<String, dynamic>? params}) async {
    final result = await _dio.put(url, queryParameters: params, data: data);
    // 需要对数据进行二次处理
    return _handleResponse(result);
  }

  // 处理解构数据
  _handleResponse(Response<dynamic> result) {
    if (result.data["code"] == '1') {
      // 如果等于1 说明请求成功
      return result.data["result"];
    }
    throw Exception(result.data["msg"]);
  }
}

RequestDio requestDio = RequestDio();
